use mio::net::{TcpListener, TcpStream};
use mio::{Events, Interest, Poll, Token};
use std::error::Error;

// 一些标记允许我们识别哪个事件针对哪个套接字
const SERVER: Token = Token(0);
const CLIENT: Token = Token(1);

fn main() -> Result<(), Box<dyn Error>> {

    // // 创建一个轮询实例。
    // let mut poll = Poll::new()?;
    // // 为事件创建存储。
    // let mut events = Events::with_capacity(1024);
    //
    // // 设置服务器套接字。
    // let addr = "127.0.0.1:6142".parse()?;
    // let mut server = TcpListener::bind(addr)?;
    // // 开始监听传入连接。
    // poll.registry().register(&mut server, SERVER, Interest::READABLE)?;
    //
    // // 启动一个 socket 客户端。
    // let mut client = TcpStream::connect(addr)?;
    // // 注册客户端套接字。
    // poll.registry().register(&mut client, CLIENT, Interest::READABLE | Interest::WRITABLE)?;
    //
    // // 启动事件循环。
    // loop {
    //     // 轮询 Mio 的事件，阻塞直到我们得到一个事件。
    //     poll.poll(&mut events, None)?;
    //
    //     // 处理每一个事件 .
    //     for event in events.iter() {
    //         // 根据事件的标记，选择相应的处理函数。
    //         match event.token() {
    //             // 服务器套接字上的可读事件。
    //             SERVER => {
    //                 // 接受一个连接。
    //                 // let (mut socket, _) = server.accept()?;
    //                 // 将套接字标记为可写。
    //                 // poll.registry().reregister(&mut socket, CLIENT, Interest::READABLE | Interest::WRITABLE)?;
    //                 // 如果这是服务器的事件，则表示连接, 准备接受。
    //                 let connection = server.accept();
    //                 // 接受连接并立即删除它, 关闭套接字并通知客户端 EOF。
    //                 drop(connection);
    //             }
    //             // 客户端套接字上的可读或可写事件。
    //             CLIENT => {
    //                 if event.is_writable() {
    //                     // if let Ok(n) = client.write(&[1, 2, 3]) {
    //                     //     println!("wrote {} bytes", n);
    //                     // } else {
    //                     //     // 客户端已断开连接。
    //                     //     poll.registry().deregister(&mut client)?;
    //                     // }
    //                     println!("client writable")
    //                 }
    //
    //                 if event.is_readable() {
    //                     // if let Ok(n) = client.read(&mut [0; 1024]) {
    //                     //     println!("read {} bytes", n);
    //                     // } else {
    //                     //     // 客户端已断开连接。
    //                     //     poll.registry().deregister(&mut client)?;
    //                     // }
    //                     println!("client readable");
    //                 }
    //
    //                 return Ok(());
    //             }
    //             _ => unreachable!(),
    //         }
    //     }
    // }
}
